home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / ALLERLEI / DESKENV / DESKENV.TXT < prev    next >
Encoding:
Text File  |  1990-06-05  |  25.5 KB  |  527 lines

  1. -------------------------     DESKENV   v 3.00     -------------------------
  2.  
  3.                               Autor:  Uwe Kern
  4.                               Datum:  04.06.90
  5.  
  6.                         entwickelt mit TURBOASS 1.30
  7.  
  8. ----------------------------------------------------------------------------
  9.  
  10.         DESKENV ist ein Public-Domain-Programm und darf frei kopiert/
  11.         benutzt werden, sofern der Ordner DESKENV.300 mit den Dateien
  12.  
  13.         - DESKENV.INF   (Beispiel-Parameterdatei)
  14.         - DESKENV.PRG   (ausführbares Programm)
  15.         - DESKENV.TXT   (ausführliche Anleitung)
  16.         - KURZANL.TXT   (Kurzanleitung)
  17.  
  18.         vollständig  und  unverändert weitergegeben wird. Verkauf und
  19.         Weitergabe zu kommerziellen Zwecken sind nicht gestattet!
  20.  
  21. ----------------------------------------------------------------------------
  22.  
  23.         Gliederung der Dokumentation DESKENV.TXT:
  24.  
  25.          0. Vorspann
  26.          1. Allgemeines
  27.          2. Start aus dem Autoordner
  28.          3. Start vom Desktop
  29.          4. Start aus einer Shell
  30.          5. Die Kommandozeile
  31.          6. Beispiele für Kommandozeilen
  32.          7. Zur Speicherverwaltung
  33.          8. Aufbau der Parameterdatei DESKENV.INF
  34.          9. Rückgabewerte für das aufrufende Programm
  35.         10. Warnung
  36.         11. Literatur
  37.         12. Danksagung
  38.  
  39. ****************************************************************************
  40.  
  41.  
  42. 0. Vorspann
  43. ===========
  44.  
  45. Das vorliegende Programm wurde vollständig in Assembler geschrieben, verwen-
  46. det keine undokumentierten Adressen, und sollte daher problemlos mit den Be-
  47. triebssystemversionen  TOS 1.0, 1.2 und 1.4 laufen.  Da mir über die Behand-
  48. lung von Environments in TOS 1.6 (STE) und TOS 3.0 (TT) bisher keine  Infor-
  49. mationen vorliegen, kann ich für diese Versionen keine Aussagen machen.
  50. Bei sachgemäβer Anwendung sollte  DESKENV eigentlich keine Probleme verursa-
  51. chen. Gleichwohl kann ich keine Garantie dafür übernehmen, daβ sämtliche an-
  52. deren Programme dieser Welt sich mit DESKENV vertragen.  Ebenso kann ich für
  53. eventuelle Datenverluste keine Verantwortung übernehmen.
  54. DESKENV ist thematisch verwandt mit den Programmen  DESKTOP (M. Fritze)  und
  55. SETENV (A. Alich), geht jedoch im Funktionsumfang über diese hinaus.
  56.  
  57.  
  58. 1. Allgemeines
  59. ==============
  60.  
  61. DESKENV  ist ein  universelles  Programm zur  Manipulation von  Environment-
  62. strings. Das Programm kann gestartet werden
  63.  - mit der Extension '.PRG' im Autoordner (beim Booten),
  64.  - mit einer der Extensions  '.PRG','.TOS','.TTP' vom Desktop (Doppelklick),
  65.  - mit beliebiger Extension aus einer Shell.
  66. In den folgenden Abschnitten werden diese unterschiedlichen Verwendungsarten
  67. im einzelnen beschrieben.
  68. Das Programm  wurde ursprünglich geschrieben,  um eine einfache  Möglichkeit
  69. zum Setzen der  AES-Environmentvariablen  zur Verfügung zu haben, da die Be-
  70. triebssysteme  TOS 1.0 - 1.4  diesen Punkt leider sträflich vernachlässigen.
  71. Inzwischen gibt es immer mehr Anwendungen, die Environments benutzen, so daβ
  72. ein sauberes und zugleich leicht zu bedienendes Hilfsmittel zur Behebung des
  73. genannten Mangels um so notwendiger wird.
  74. Das vorliegende Programm ist jedoch in seiner  Anwendung nicht auf das  AES-
  75. Environment beschränkt, es gestattet vielmehr eine Einfluβnahme auf alle En-
  76. vironments von Prozessen, die in der Hierarchie zwischen DESKENV.xxx und dem
  77. AES liegen.
  78. Alle Operationen,  die DESKENV durchführt,  beziehen sich auf einen  solchen
  79. - durch entsprechende Kommandos festzulegenden - Prozeβ, der im weiteren als
  80. 'aktuelles Level' bezeichnet wird.
  81. Mit  'Environment'  ist stets die Gesamtheit aller  Environmentvariablen des
  82. aktuellen Levels gemeint.
  83.  
  84.  
  85. 2. Start aus dem Autoordner
  86. ===========================
  87.  
  88. DESKENV.PRG sucht im Wurzelverzeichnis des Bootlaufwerks (also dort, wo sich
  89. auch DESKTOP.INF befinden sollte) die Datei DESKENV.INF, deren Aufbau weiter
  90. unten beschrieben ist.  Ist diese vorhanden,  und hat sie eine Länge > 0, so
  91. wird sie als AES-Environment interpretiert und in den Speicher geladen (alle
  92. Zeichen mit einem ASCII-Wert < 32 werden dabei eliminiert);   nun werden die
  93. nötigen Adressen gesetzt und anschlieβend das AES gestartet.
  94. Folglich sollte  DESKENV.PRG  das physikalisch letzte Programm im Autoordner
  95. sein, da hinterher keine weiteren Autostart-Programme mehr abgearbeitet wer-
  96. den.  Es gibt leider keinen anderen Weg, als das AES selbst zu starten, denn
  97. das  Betriebssystem initialisiert sein kümmerliches eigenes Environment erst
  98. dann, wenn der gesamte Autoordner abgearbeitet ist.
  99. Falls in der Parameterdatei nicht vorhanden,  wird eine  Environmentvariable
  100. ENVSIZE=xxxx angelegt, die dann (als vierstellige Hexadezimalzahl) die Länge
  101. des gesamten Environments enthält.
  102.  
  103. Wenn eine der folgenden Bedingungen auftritt,  terminiert das Programm, ohne
  104. das AES-Environment zu beeinflussen:
  105.  
  106.         - DESKENV.INF nicht gefunden.
  107.         - DESKENV.INF hat die Länge 0.
  108.         - Fehler beim Öffnen oder Lesen von DESKENV.INF.
  109.         - Beim Programmstart ist die Taste '~' gedrückt.
  110.  
  111. Das Environment besteht dann nur aus der  Variablen  PATH=...,  insbesondere
  112. existiert die Variable ENVSIZE nicht.
  113. Sofern man ein absolut leeres Environment wünscht, sollte man also eine INF-
  114. Datei der Länge >= 1 anlegen, die mit Nullen gefüllt ist.
  115.  
  116.  
  117. 3. Start vom Desktop
  118. ====================
  119.  
  120. Versehen mit einer der Extensions '.PRG','.TOS','.TTP',  kann  DESKENV durch
  121. Doppelklick vom Desktop aus gestartet werden.  Eine Kommandozeile kann dabei
  122. normalerweise nur bei '.TTP'-Programmen übergeben werden.
  123. Der Programmablauf ist bei den anderen  Extensions analog zu einem Start aus
  124. dem Autoordner,  mit dem Unterschied,  daβ nun selbstverständlich nicht mehr
  125. das AES gestartet wird. Je nachdem, ob im bisherigen Environment genug Platz
  126. für das  neu zu setzende vorhanden ist oder nicht,  wird ein  entsprechender
  127. Speicherbereich resident belegt.  Die Länge des bisherigen  Environments ist
  128. das  Maximum des tatsächlich von Variablen belegten Speichers und des Wertes
  129. von ENVSIZE (falls vorhanden).
  130. Aus diesem Grund ist es wichtig, daβ ENVSIZE immer einen korrekten Wert hat!
  131. Beim Start als  '.TTP'-Programm kann man zusätzlich eine Kommandozeile über-
  132. geben, deren Aufbau in Abschnitt 5 ausführlich erläutert wird.
  133. Nun gibt es einen TOS-Fehler,  der mich dazu gebracht hat,  eine weitere Op-
  134. tion für den Desktop-Start einzubauen.
  135. Beim Starten eines  '.TOS'- oder '.TTP'-Programmes vom Desktop werden einige
  136. Speicherbereiche des Desktop freigegeben,  u. a. auch der AES-Bildschirmpuf-
  137. fer. Das ist zunächst einmal lobenswert.  Jedoch wird aufgrund eines Fehlers
  138. in der  Speicherverwaltung nach Beendigung des Programmes der nun wieder er-
  139. forderliche  AES-Bildschirmpuffer  zuweilen vom gröβten Speicherblock  abge-
  140. zwackt,  so daβ sich dessen  Länge unnötigerweise verringert.  Dieser Effekt
  141. tritt auf jeden Fall dann auf, wenn man nach dem Booten erstmals ein '.TOS'-
  142. oder '.TTP'-Programm vom Desktop startet. Bei TOS 1.4 gehen dadurch immerhin
  143. etwa  13 K Speicher verloren.  Für  Einzelheiten verweise ich auf den ausge-
  144. zeichneten Artikel [3].
  145. Es ist nun aber nicht einzusehen,  daβ man allein für den  Wunsch,  sich das
  146. aktuelle Environment anzuschauen (siehe Abschnitt 5),  schon eine Strafe von
  147. 13 K entrichten muβ.  Daher habe ich einen primitiven  Kommandozeilen-Editor
  148. eingebaut.  Dieser wird  dadurch aktiviert,  daβ man beim  Programmstart die
  149. linke Shifttaste betätigt, und zwar so lange, bis der Cursor erscheint.
  150. Diese  Eigenschaft ist unabhängig von der  Programm-Extension,  funktioniert
  151. also insbesondere für DESKENV.PRG (=> Speicherverlust vermieden)!
  152. Nun kann man seine  Kommandozeile eintippen;  die maximale Länge der Eingabe
  153. beträgt 79 Zeichen. Der 'Editor' versteht folgende Steuerzeichen:
  154.  
  155.         Backspace       Lösche Zeichen links vom Cursor.
  156.         Esc             Lösche gesamte Zeile.
  157.         Return/Enter    Ende der Eingabe, Programmlauf mit Kommandozeile.
  158.         Undo            Ende der Eingabe und des Programms.
  159.  
  160. Alle sonstigen Zeichen mit einem ASCII-Code < 32 werden ignoriert.
  161.  
  162.  
  163. 4. Start aus einer Shell
  164. ========================
  165.  
  166. Bei einer  Shell kann man in der Regel direkt beim  Programmaufruf eine Kom-
  167. mandozeile übergeben; der Trick mit der linken Shifttaste (vgl. Abschnitt 3)
  168. funktioniert aber auch hier, sofern die Shell nicht dazwischenfunkt.
  169. Wenn die Shell es erlaubt, kann man eventuelle Fehlermeldungen,  die in D0.w
  170. zurückgegeben werden, auswerten. Siehe dazu auch Abschnitt 9.
  171.  
  172.  
  173. 5. Die Kommandozeile
  174. ====================
  175.  
  176. Wir geben zunächst die Syntax der Kommandozeile in  EBNF an.  Dabei kann ein
  177. Term in eckigen Klammern  '[...]'  null- oder einmal vorkommen,  ein Term in
  178. geschweiften Klammern '{...}' beliebig oft (auch keinmal) wiederholt werden.
  179. Runde Klammern '(...)' dienen der Zusammenfassung von Termen,  '|'  bedeutet
  180. ein exklusives Oder;  Zeichen in Anführungsstrichen  '"..."'  sind direkt in
  181. die Kommandozeile zu schreiben.  Diese Form der  EBNF wird z. B. in [2] ver-
  182. wendet.
  183.  
  184.  
  185.         cmd    = flag{" "}level{" "}(var"="str|opt)
  186.  
  187.         flag   = ["*"]
  188.         level  = {"+"}|"."
  189.         var    = a{b}
  190.         str    = {c}
  191.         opt    = [sel]{" "}(path|"/"addr)
  192.         sel    = "-"("v"|"V"|"s"|"S"|"b"|"B"|"h"|"H")
  193.         path   = [d{b}]
  194.         addr   = eeeeeeee
  195.         <char> = ASCII-Zeichen zwischen 32 und 255
  196.         a      = <char> mit a <> " ","-","="
  197.         b      = <char> mit b <> "="
  198.         c      = <char>
  199.         d      = <char> mit d <> " ","-","=","/"
  200.         e      = "0"|"1"|"2"| ... |"9"|"A"|"B"| ... |"F"|"a"| ... |"f"
  201.  
  202.  
  203. Diese Regeln sollte man dahingehend interpretieren,  daβ alle korrekten Ein-
  204. gaben die obige Form haben. Die Umkehrung gilt jedoch nicht: nicht jede Kom-
  205. mandozeile, die syntaktisch korrekt ist, ist auch sinnvoll!
  206. Bei den  Optionen in  'sel'  ist zu beachten,  daβ kein Unterschied zwischen
  207. Groβ- und Kleinschreibung  gemacht  wird;  "-v"  bedeutet also  dasselbe wie
  208. "-V".  Es ist aber zu beachten,  daβ es bei den Namen von Environment-Varia-
  209. blen durchaus auf die genaue Schreibweise ankommt. Da im übrigen bei TOS 1.4
  210. die Kommandozeile von '.TTP'-Programmen nicht mehr automatisch in  Groβbuch-
  211. staben  konvertiert wird,  sollte man sich auch bei  Verwendung älterer TOS-
  212. Versionen eine korrekte Eingabe angewöhnen.
  213.  
  214.  
  215. Die einzelnen Optionen:
  216.  
  217.  
  218. 1. 'flag'
  219. ---------
  220.  
  221. 'flag' gibt an, ob nach der Programmausführung auf einen  Tastendruck gewar-
  222. tet werden soll (bei den Optionen "-v" und "-h" geschieht dies automatisch).
  223. Falls "*" gesetzt ist, werden folgende Tasten berücksichtigt:
  224.  
  225.         Return/Enter    Beendigung ohne weitere Änderung.
  226.         Undo            Die  vorgesehene  Operation wird rückgängig gemacht,
  227.                         soweit dies sinnvoll ist (Setzen/Ändern von Environ-
  228.                         mentvariablen).
  229.  
  230.  
  231. 2. 'level'
  232. ----------
  233.  
  234. 'level' bestimmt das aktuelle Level.  Dabei gibt es folgende  Möglichkeiten:
  235.  
  236.         ""      aktuelles Level = AES
  237.         "."     aktuelles Level = DESKENV.xxx
  238.         "+"     aktuelles Level = Vaterprozeβ von DESKENV.xxx
  239.         "++"    aktuelles Level = 'Groβvaterprozeβ' von DESKENV.xxx
  240.         usw.
  241.  
  242. Bei  n-fachem  "+"  wird entsprechend der n-te Prozeβ in der Hierarchie über
  243. DESKENV.xxx zum aktuellen Level.  Dabei kann man jedoch maximal bis zum  AES
  244. aufsteigen,  d. h. in der Regel wird man bei  "++" oder  "+++" schon das AES
  245. erreicht haben.
  246.  
  247.  
  248. 3. 'var"="str'
  249. --------------
  250.  
  251. 'var' ist eine Environmentvariable des aktuellen Levels,  der der Wert 'str'
  252. zugewiesen werden soll.  Ist die Variable bereits vorhanden, wird der String
  253. 'str' an die entsprechende  Stelle im  Environment eingefügt  (der bisherige
  254. Wert geht selbstverständlich verloren);  andernfalls  wird die  Variable neu
  255. angelegt und an den Anfang des Environments kopiert.
  256. Sofern die Länge des neuen  Environments die des alten übertrifft,  wird ein
  257. entsprechender Speicherbereich resident gehalten.
  258.  
  259.  
  260. 4. 'sel'
  261. --------
  262.  
  263.  -v    view     Zeige das durch 'level' bestimmte  Environment an.  Alle auf
  264.                 '-v' folgenden Zeichen werden ignoriert.
  265.  -s    save     Speichere das durch  'level'  spezifizierte  Environment auf
  266.                 Diskette in der durch  'path'  spezifizierten  Datei oder an
  267.                 der durch 'addr' spezifizierten Adresse.
  268.                 Im Falle des  Kopierens an eine  Adresse  folgt auf die zwei
  269.                 abschlieβenden Nullbytes ein Byte-Wert,  der genau dann Null
  270.                 ist, wenn das aktuelle Level niedriger als das AES ist.
  271.  -b    backup   Speichern mit Backup. Diese Option unterscheidet sich von -s
  272.                 nur dadurch,  daβ beim Speichern auf Diskette eine eventuell
  273.                 schon vorhandene Datei mit dem Namen  <path> umbenannt wird;
  274.                 sie erhält die Extension '.EBU' (Environment BackUp).
  275.  -h    help     Anzeige des aktuellen  Environments und der Optionen für die
  276.                 Kommandozeile in Kurzform.  Alle auf  '-h' folgenden Zeichen
  277.                 werden ignoriert.
  278.  
  279.  
  280. Bei den Optionen -v und -h wird unabhängig davon,  ob am Anfang ein '*' ein-
  281. gegeben wurde oder nicht, auf einen Tastendruck gewartet. Dabei sind nur die
  282. Tasten Return/Enter und Undo erlaubt.
  283. Bei allen weiteren Eingaben der Form '-'{char} wird bisher wie bei '-h' ver-
  284. fahren.  Da diese Zeichenketten aber als mögliche  Optionen für künftige Er-
  285. weiterungen reserviert sind, sollte man zum Aufruf der Help-Funktion nur das
  286. vorgesehene Kommando '-h' verwenden.
  287.  
  288.  
  289. 5. Kein 'sel' vorhanden
  290. -----------------------
  291.  
  292. a) 'path'       Die durch  'path'  spezifizierte Datei wird als Environment-
  293.                 Parameterdatei interpretiert;  das Environment wird entspre-
  294.                 chend gesetzt (Aufbau der Datei: siehe Abschnitt 8).
  295. b) 'addr'       An der durch  'addr'  spezifizierten Adresse wird eine Kette
  296.                 von durch jeweils ein Nullbyte begrenzten und zwei Nullbytes
  297.                 abgeschlossenen Strings erwartet.  Die Adresse wird als  En-
  298.                 vironmentzeiger für das aktuelle  Level eingetragen.  Es er-
  299.                 folgt keine Überpüfung, ob die Adresse sinnvoll ist!
  300.                 
  301.  
  302. 6. 'path'
  303. ---------
  304.  
  305. 'path' ist der Name oder  vollständige  Pfadname einer Datei.  Es wird immer
  306. vom derzeit aktuellen  Directory ausgehend nach dieser Datei gesucht.  Falls
  307. 'path' leer ist, wird als Default der Name 'DESKENV.PRG' verwendet und folg-
  308. lich im aktuellen Verzeichnis gesucht.
  309.  
  310.  
  311. 7. 'addr'
  312. ---------
  313.  
  314. 'addr' ist eine Speicheradresse,  die in  achtstelliger  Hexadezimalschreib-
  315. weise vorliegen muβ. Für die Ziffern 'A' - 'F' sind auch Kleinbuchstaben er-
  316. laubt.  Da grundsätzlich keine  Überprüfung  stattfindet,  ob die angegebene
  317. Adresse  zulässig bzw. sinnvoll ist,  sollte man auf eine  korrekte  Eingabe
  318. achten. Adressen, die ins ROM zeigen, sind in jedem Fall zu vermeiden!
  319.  
  320.  
  321. 6. Beispiele für Kommandozeilen
  322. ===============================
  323.  
  324. a) Leere Kommandozeile:  Suche Datei 'DESKENV.INF' im aktuellen Verzeichnis,
  325.    und setze entsprechend dieser Datei das AES-Environment.
  326. b) '*':  Wie bei a), nur wird zusätzlich auf einen Tastendruck gewartet; bei
  327.    Bedarf kann mittels 'Undo' diese Operation rückgängig gemacht werden.
  328. c) '*++-sd:\grandma.inf':  Speichere das  Environment des Groβvaterlevels in
  329.    der Datei 'D:\GRANDMA.INF' und warte auf einen Tastendruck.
  330. d) '* ++   -S    d:\grAndma.InF':  Wie c).
  331. e) '.-b':  Speichere das Environment, welches 'DESKENV.xxx' übergeben wurde,
  332.    im aktuellen  Verzeichnis in die Datei  'DESKENV.INF';  eine  evtl. schon
  333.    vorhandene Datei dieses Namens wird vorher in 'DESKENV.EBU' umbenannt.
  334. f) '* Hans=1234':  Suche im AES-Environment eine Variable namens 'Hans', und
  335.    setze ihren Wert auf '1234'.  Lege bei erfolgloser  Suche einen neuen En-
  336.    vironmentstring 'Hans=1234' an. Warte anschlieβend auf einen Tastendruck.
  337. g) '-Vaksdliowueq':  Zeige das AES-Environment an, und warte auf eine Taste.
  338. h) '+-s/0007a12F':  Kopiere das Environment des Vaterprozesses an die Adres-
  339.    se $7A12F.
  340. i) '+   -b  /0007A12F':  Wie h).
  341.  
  342.  
  343. 7. Zur Speicherverwaltung
  344. =========================
  345.  
  346. Bei den eben beschriebenen Methoden, eine einzelne Variable bzw. das gesamte
  347. Environment zu verändern, wird - abgesehen von der Adressenversion - in fol-
  348. gender Weise verfahren:
  349. Wenn das geänderte Environment in den für das ursprüngliche  Environment re-
  350. servierten Bereich hineinpaβt, wird es dort hineinkopiert.
  351. Ansonsten wird ein entsprechender Teil des Speichers resident belegt.  Dabei
  352. ist noch zu beachten,  daβ im Falle einer Manipulation des  AES-Environments
  353. stets die globale Variable ENVSIZE=xxxx auf den neuesten Stand gebracht wird
  354. - sofern sie schon vorhanden ist.  Falls diese Variable nicht existiert, der
  355. neue  Environmentstring aber ohnehin länger als der alte ist,  wird  ENVSIZE
  356. neu angelegt.
  357. Im residenten Fall läβt sich schwer abschätzen, wieviel Speicher tatsächlich
  358. verloren geht,  da unter  Umständen eine  Separation  von vormals  zusammen-
  359. hängenden Speicherbereichen erfolgt.  Für den  Start von Programmen ist aber
  360. meistens nur der gröβte zusammenhängende Speicherblock von Interesse.  Diese
  361. Tatsache macht den in Abschnitt 3 beschriebenen TOS-Fehler so unangenehm.
  362. Im Falle eines Starts aus dem Autoordner (vermutlich ohnehin die Hauptanwen-
  363. dung) kann man allerdings die  Gröβe des verbrauchten Speichers ziemlich ge-
  364. nau bestimmen:  sie  beträgt ca.  128 Bytes + Environment-Länge,  wobei  die
  365. letztere sich wieder aus der  Länge der Strings und dem Wert von ENVSIZE er-
  366. rechnet.  Es wird also nur soviel Speicher belegt,  wie unbedingt nötig bzw.
  367. unvermeidbar ist.
  368.  
  369.  
  370. 8. Aufbau der Parameterdatei DESKENV.INF
  371. ========================================
  372.  
  373. In der Parameterdatei stehen zeilenweise die einzelnen Environmentvariablen.
  374. Beliebig viele Leerzeilen sind erlaubt; da alle Zeichen mit einem ASCII-Code
  375. < 32 als Trennsymbole zwischen einzelnen Variablen interpretiert und  elimi-
  376. niert bzw. durch Nullbytes ersetzt werden,  hat man bei der Wahl der Zeilen-
  377. trennzeichen eine gewisse Freiheit und muβ sich nicht auf die üblichen CR,LF
  378. oder LF festlegen.
  379. Eine besondere Rolle spielt die Variable ENVSIZE. Sie gibt die Länge des für
  380. das AES-Environment reservierten Speicherbereiches an und muβ korrekt in der
  381. folgenden Form angegeben werden:
  382.  
  383.         ENVSIZE=wxyz    mit Hexadezimalziffern w,x,y,z.
  384.  
  385. Für die Ziffern 'A',...,'F' sind auch  Kleinbuchstaben erlaubt.  Für die Be-
  386. rechnung des  Wertes gibt es nun zwei  Möglichkeiten:  den absoluten und den
  387. relativen Modus. Die Unterscheidung erfolgt durch das oberste Bit von w.
  388.  
  389. absolut (Bit gelöscht, w = '0',...,'7'):
  390.    ENVSIZE wird berechnet als Maximum der vierstelligen Hexadezimalzahl wxyz
  391.    und der  tatsächlichen  Länge des durch die  Parameterdatei gegebenen En-
  392.    vironments;
  393. relativ (Bit gesetzt, w = '8',...,'F'):
  394.    ENVSIZE wird berechnet als Summe der vierstelligen Hexadezimalzahl w'xyz,
  395.    wobei w' aus w durch Löschen des obersten Bits entsteht, und der tatsäch-
  396.    lichen Länge des durch die Parameterdatei gegebenen Environments.
  397.  
  398. Diese Aussagen gelten übrigens nur für den Fall, daβ man als aktuelles Level
  399. das AES hat.  Andernfalls wird  ENVSIZE unverändert in das Environment über-
  400. nommen.
  401.  
  402. Es ist zu beachten,  daβ maximal  32000 Bytes für das Environment reserviert
  403. werden, d. h. im absoluten Modus sollte man maximal ENVSIZE=7D00 setzen. Bei
  404. gröβeren Werten könnte es zu unvorhergesehenen Reaktionen kommen.
  405. Entsprechend  muβ man im  relativen Modus dafür sorgen,  daβ die Gesamtlänge
  406. nicht zu groβ wird.  Es ist auch nicht auszuschlieβen, daβ es  schon im  TOS
  407. eine Maximallänge für Environments gibt.
  408.  
  409.  
  410. 9. Rückgabewerte für das aufrufende Programm
  411. ============================================
  412.  
  413. Nach  Beendigung des  Programmes enthält  Register D0 im unteren  Wort einen
  414. Rückgabewert, der das Ergebnis des Programmlaufes dokumentiert.  Bei Fehlern
  415. (D0.w < 0) ertönt zusätzlich ein Glockenton.
  416. Im folgenden sind nur die wichtigsten  Rückgabewerte angegeben; im Zusammen-
  417. hang mit  Diskettenoperationen können selbstverständlich noch einige weitere
  418. Fehlermeldungen auftreten  (ungültige Laufwerksbezeichnung, Sektor nicht ge-
  419. funden, ...), die man gegebenenfalls in der Literatur (z. B. [1]) nachschla-
  420. gen kann.
  421.  
  422.  
  423. Dezimal  Hex     Bedeutung
  424. ----------------------------------------------------------------------------
  425.  
  426.   > 0            gewünschte Operation fehlerfrei durchgeführt;
  427.                  D0.w Bytes werden resident im Speicher gehalten
  428.     0            gewünschte Operation fehlerfrei durchgeführt;
  429.                  kein speicherresidenter Anteil
  430.  
  431.   -10    FFF6    WRITE_FAULT:   Fehler beim Schreiben der Parameterdatei
  432.                                 (bei Optionen -s,-b)
  433.   -11    FFF5    READ_FAULT:    Fehler beim Lesen der Parameterdatei
  434.   -13    FFF3    WRITE_PROTECT: Diskette ist schreibgeschützt
  435.                                 (bei Optionen -s,-b)
  436.   -33    FFDF    EFILNF:        Parameterdatei nicht gefunden
  437.   -36    FFDC    EACCDN:        Zugriff nicht erlaubt
  438.                                 (bei Optionen -s,-b)
  439.  -128    FF80    CANCEL:        Abbruch, 'Undo'-Taste wurde gedrückt
  440.                                 (bzw. '~' beim Programmstart)
  441.  
  442.  
  443. Die Fehlermeldung  EACCDN  entsteht etwa dann,  wenn man das Environment auf
  444. Diskette speichern will,  dort aber schon ein  Ordner mit dem für die  Datei
  445. vorgesehenen Namen existiert.
  446. Die Fehlermeldung  READ_FAULT/WRITE_FAULT  wird auch dann erzeugt,  wenn die
  447. betreffende Datei zwar gelesen/beschrieben werden kann,  aber die Anzahl der
  448. so bewegten Bytes nicht der vorgesehenen Dateilänge entspricht. Dies ist vor
  449. allem bei Schreibversuchen auf ein fast volles Laufwerk zu erwarten.
  450.  
  451. Hat man DESKENV mit der Extension '.PRG' vom Desktop gestartet,  so bewirken
  452. manche Fehlermeldungen (z. B. EACCDN) das Erscheinen einer Alertbox,  die zu
  453. dem betreffenden  Fehler einen mehr oder weniger aussagekräftigen  Text lie-
  454. fert. Für diese Alertboxen ist das Betriebssystem verantwortlich, das offen-
  455. sichtlich einen Blick auf D0 wirft.
  456.  
  457. Die Fehlermeldungen werden von  DESKENV als  vierstellige  Hexadezimalzahlen
  458. angezeigt.  Im Falle eines residenten Anteils von $xxxx Bytes erscheint eine
  459. Ausgabe der Form  'R = xxxx'.  Diese Angabe ist  -  wie auch die  Werte  bei
  460. 'Bytes used/free = yyyy/zzzz'  -  als  Hexzahl zu verstehen  und erfolgt wie
  461. immer ohne Gewähr.
  462.  
  463.  
  464. 10. Warnung
  465. ===========
  466.  
  467. ENVSIZE ist eine globale Environmentvariable, die sich einzig und allein auf
  468. das AES-Environment bezieht; sie gibt die Länge des dafür reservierten Spei-
  469. chers an.  Manipulationen durch 'Hineinpoken' von Werten können entsetzliche
  470. Folgen haben (Crash, Chaos und Verwirrung).
  471. Hingegen ist es  durchaus erlaubt,  ENVSIZE mit dem Kommando  'ENVSIZE=xxxx'
  472. einen neuen Wert zu geben.  Dabei ist sowohl der absolute als auch der rela-
  473. tive Modus (vgl. Abschnitt 8) möglich.
  474. Einzige Einschränkung:  eine Verkleinerung des  reservierten  Bereiches  ist
  475. nicht möglich  (Beispiel: ist der bisherige Wert 'ENVSIZE=0020', so wird das
  476. Kommando 'ENVSIZE=0010' schlicht und einfach ignoriert).
  477. Auf einem Level unterhalb des AES kann man  ENVSIZE nach Belieben verändern,
  478. da ENVSIZE ja nur über das AES-Environment eine Aussage macht.  Wenn man al-
  479. lerdings Grund zu der Annahme hat,  daβ ein Tochterprozeβ die Gröβe des AES-
  480. Environments feststellen will,  sollte man jenem fairerweise einen korrekten
  481. ENVSIZE-String übergeben.
  482.  
  483. Die  Globalität von  ENVSIZE hat ihre Ursache darin,  daβ das Betriebssystem
  484. sich natürlich nicht darum kümmert,  wieviel Platz für sein  Environment ge-
  485. rade reserviert ist,  sondern nur das aktuell vorhandene Environment berück-
  486. sichtigt. Auch hierzu wieder ein Beispiel:  ENVSIZE=0100, tatsächliche Länge
  487. = $80 Bytes. Beim Aufruf eines Programmes mittels 'Pexec' reserviert TOS nun
  488. unmittelbar vor der  Basepage einen  Bereich der  Länge $80 und  kopiert die
  489. durch jeweils ein Nullbyte getrennten und eine doppelte Null abgeschlossenen
  490. Environmentstrings in diesen Bereich. Würde man nun die volle Länge von $100
  491. Bytes ausschöpfen,  so müβte man dazu einen Teil der Basepage überschreiben.
  492. Die andere Möglichkeit ist nun,  sich im eigenen  Programm genügend Speicher
  493. zu reservieren,  dorthin das eigene Environment zu kopieren und entsprechend
  494. für die aufzurufenden Tochterprozesse zu manipulieren.
  495.  
  496. Im übrigen kann jeder Prozeβ mit seinem  eigenen Environment machen,  was er
  497. will,  ohne daβ davon irgendwelche  übergeordneten  Prozesse betroffen sind;
  498. umgekehrt  haben Änderungen an einem  Parent-Environment erst beim  nächsten
  499. Child-Aufruf Konsequenzen.
  500.  
  501. Lange Environmentstrings können zu  Speicherfressern ausarten, da sie in der
  502. Regel an alle Tochterprozesse weitervererbt und damit dupliziert werden. Zu-
  503. dem bekommen auch alle Accessories ihr eigenes Environment vorgesetzt  (vgl.
  504. [3]).  Ein groβer Wert von ENVSIZE  (ca. 2-4 K) ist hingegen nicht unbedingt
  505. schädlich, da ja  - wie bereits erwähnt -  nur die eigentlichen Environment-
  506. strings weitervererbt werden, man andererseits aber genügend Platz für Expe-
  507. rimente hat, ohne ständig neue Programmleichen im Speicher zu erzeugen (vgl.
  508. Abschnitt über die Speicherverwaltung).
  509.  
  510.  
  511. 11. Literatur
  512. =============
  513.  
  514. [1]   Jankowski/Reschke/Rabich: ATARI ST Profibuch, 2. Aufl.
  515. [2]   Dal Cin/Lutz/Risse: Programmierung in Modula-2, 2. Aufl.
  516. [3]   ???: TOS intern, 'ST Computer'-Sonderheft Nr. 2
  517.  
  518.  
  519. 12. Danksagung
  520. ==============
  521.  
  522. Ich danke allen, die mir durch Anregungen, Kritik und gutgemeinte Vorschläge
  523. die Programmierung erschwert haben,  da das ursprüngliche  DESKENV  (v 2.xx)
  524. sonst vermutlich für immer als ein zwar recht nützliches, jedoch unflexibles
  525. Programm ein kümmerliches Dasein gefristet hätte.
  526.  
  527.